
#include "contract.h"
#include "IO.h"
#include "BSP_IO.h"

void IO_Init(const IO_T* io, uint32_t mode){
	BSP_IO_Init(BSP_IO_ToPort(io->port), BSP_IO_ToPin(io->pin), mode);
}

void IO_Config(const IO_T* io, uint32_t mode){
	BSP_IO_SetMode(BSP_IO_ToPort(io->port), BSP_IO_ToPin(io->pin), mode);
}

void IO_Set(const IO_T* io, int state){
	BSP_IO_Set(BSP_IO_ToPort(io->port), BSP_IO_ToPin(io->pin), state);
}

int IO_Get(const IO_T* io){
	return BSP_IO_Get(BSP_IO_ToPort(io->port), BSP_IO_ToPin(io->pin));
}

//获取一组IO的状态
uint32_t IO_MultGet(const IO_T* io, uint8_t num){
	uint32_t map = 0;
	uint8_t i;
	
	for(i = 0; i < num; ++i){
		if(BSP_IO_Get(BSP_IO_ToPort(io[i].port), BSP_IO_ToPin(io[i].pin))){
			map |= (1u << i);
		}
	}
	return map;
}

//设置一组IO的状态
void IO_MultSet(const IO_T* io, uint8_t num, uint32_t stateMap){
	uint8_t i;
	
	for(i = 0; i < num; ++i){
		BSP_IO_Set(BSP_IO_ToPort(io[i].port), BSP_IO_ToPin(io[i].pin), stateMap & (1u << i));
	}
}


int IO_IsValid(const IO_T* io){
	return io && io->pin < 0xFFFF;
}


